package com.smartsystem.common.utils;

import lombok.Data;

/**
 * 统一响应结果类
 */
@Data
public class Result<T> {
    
    /**
     * 状态码
     */
    private int code;
    
    /**
     * 消息
     */
    private String message;
    
    /**
     * 数据
     */
    private T data;
    
    /**
     * 成功标志
     */
    private boolean success;
    
    /**
     * 时间戳
     */
    private String timestamp;
    
    /**
     * 构造函数
     */
    private Result() {
    }
    
    /**
     * 成功响应
     * @param data 数据
     * @param <T> 数据类型
     * @return 响应结果
     */
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(200);
        result.setMessage("操作成功");
        result.setData(data);
        result.setSuccess(true);
        result.setTimestamp(java.time.Instant.now().toString());
        return result;
    }
    
    /**
     * 成功响应（无数据）
     * @param <T> 数据类型
     * @return 响应结果
     */
    public static <T> Result<T> success() {
        return success(null);
    }
    
    /**
     * 成功响应（带自定义消息）
     * @param data 数据
     * @param message 消息
     * @param <T> 数据类型
     * @return 响应结果
     */
    public static <T> Result<T> success(T data, String message) {
        Result<T> result = new Result<>();
        result.setCode(200);
        result.setMessage(message);
        result.setData(data);
        result.setSuccess(true);
        result.setTimestamp(java.time.Instant.now().toString());
        return result;
    }
    
    /**
     * 失败响应
     * @param code 状态码
     * @param message 消息
     * @param <T> 数据类型
     * @return 响应结果
     */
    public static <T> Result<T> fail(int code, String message) {
        Result<T> result = new Result<>();
        result.setCode(code);
        result.setMessage(message);
        result.setData(null);
        result.setSuccess(false);
        result.setTimestamp(java.time.Instant.now().toString());
        return result;
    }
    
    /**
     * 失败响应（使用默认状态码）
     * @param message 消息
     * @param <T> 数据类型
     * @return 响应结果
     */
    public static <T> Result<T> fail(String message) {
        return fail(500, message);
    }
}